import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * CSV习题查看器（自动加载版）
 * 直接读取同目录下的 math_exercises.csv 文件并显示
 */
public class CsvExerciseViewer extends JFrame {
    // 状态标签
    private JLabel statusLabel;
    
    // 练习界面组件
    private JLabel exerciseLabel; // 显示当前习题
    private JTextField answerField; // 用户输入答案
    private JButton prevButton; // 上一题按钮
    private JButton nextButton; // 下一题按钮
    private JButton checkButton; // 确定按钮
    private JLabel correctAnswerLabel; // 显示正确答案
    private JLabel resultLabel; // 显示答题结果
    
    // 存储习题数据
    private List<String[]> exercises = new ArrayList<>();
    private int currentExerciseIndex = -1; // 当前习题索引

    public CsvExerciseViewer() {
        // 初始化窗体配置
        initFrame();
        // 初始化界面组件
        initComponents();
        // 布局组件
        layoutComponents();
        // 启动后自动读取同目录下的 math_exercises.csv
        autoLoadCsvFile();
    }

    /**
     * 初始化窗体基本配置
     */
    private void initFrame() {
        setTitle("CSV习题查看器（自动加载）"); // 窗体标题
        setSize(600, 400); // 窗体大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 关闭时退出程序
        setLocationRelativeTo(null); // 居中显示
        setResizable(true); // 允许调整大小
    }

    /**
     * 初始化界面组件
     */
    private void initComponents() {
        // 状态标签（显示加载状态）
        statusLabel = new JLabel("正在加载同目录下的 math_exercises.csv 文件...");
        statusLabel.setFont(new Font("宋体", Font.PLAIN, 12));
        statusLabel.setForeground(Color.GRAY);
        
        // 新增习题查看界面组件
        exerciseLabel = new JLabel("请加载习题文件");
        exerciseLabel.setFont(new Font("宋体", Font.PLAIN, 16));
        
        JLabel answerPromptLabel = new JLabel("请输入答案：");
        answerField = new JTextField(10);
        
        prevButton = new JButton("上一题");
        prevButton.setEnabled(false);
        prevButton.addActionListener(e -> showPreviousExercise());
        
        nextButton = new JButton("下一题");
        nextButton.setEnabled(false);
        nextButton.addActionListener(e -> showNextExercise());
        
        checkButton = new JButton("确定");
        checkButton.setEnabled(false);
        checkButton.addActionListener(e -> checkAnswer());
        
        correctAnswerLabel = new JLabel("");
        correctAnswerLabel.setFont(new Font("宋体", Font.PLAIN, 14));
        
        resultLabel = new JLabel("");
        resultLabel.setFont(new Font("宋体", Font.BOLD, 14));
    }

    /**
     * 布局界面组件
     */
    private void layoutComponents() {
        // 使用边界布局（BorderLayout）
        setLayout(new BorderLayout(10, 10));

        // 顶部面板（状态标签）
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10));
        topPanel.add(statusLabel);
        
        // 习题查看面板
        JPanel exercisePanel = new JPanel(new GridLayout(5, 1, 10, 10));
        exercisePanel.setBorder(BorderFactory.createTitledBorder("习题练习"));
        
        // 习题显示
        JPanel exerciseDisplayPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        exerciseDisplayPanel.add(exerciseLabel);
        
        // 答案输入
        JPanel answerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        answerPanel.add(new JLabel("请输入答案："));
        answerPanel.add(answerField);
        
        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 10));
        buttonPanel.add(prevButton);
        buttonPanel.add(checkButton);
        buttonPanel.add(nextButton);
        
        // 结果显示
        JPanel resultPanel = new JPanel(new GridLayout(2, 1));
        resultPanel.add(resultLabel);
        resultPanel.add(correctAnswerLabel);
        
        // 添加到习题面板
        exercisePanel.add(exerciseDisplayPanel);
        exercisePanel.add(answerPanel);
        exercisePanel.add(buttonPanel);
        exercisePanel.add(resultPanel);
        exercisePanel.add(new JPanel()); // 占位
        
        // 直接添加习题面板到中心位置，不使用分割面板
        add(topPanel, BorderLayout.NORTH);
        add(exercisePanel, BorderLayout.CENTER);
    }

    /**
     * 自动加载同目录下的 math_exercises.csv 文件
     */
    private void autoLoadCsvFile() {
        // 获取当前程序运行目录（同文件所在目录）
        String currentDir = System.getProperty("user.dir");
        // 构建CSV文件路径（当前目录 + 文件名）
        File csvFile = new File(currentDir, "math_exercises.csv");

        // 检查文件是否存在
        if (!csvFile.exists()) {
            statusLabel.setText("错误：同目录下未找到 math_exercises.csv 文件！");
            statusLabel.setForeground(Color.RED);
            JOptionPane.showMessageDialog(this,
                    "未找到文件：" + csvFile.getAbsolutePath() + "\n请确保该文件与程序在同一目录下",
                    "文件不存在",
                    JOptionPane.ERROR_MESSAGE);
            return;
        }

        // 检查是否是文件（不是目录）
        if (!csvFile.isFile()) {
            statusLabel.setText("错误：math_exercises.csv 不是有效文件！");
            statusLabel.setForeground(Color.RED);
            JOptionPane.showMessageDialog(this,
                    "路径：" + csvFile.getAbsolutePath() + "\n不是有效文件",
                    "无效文件",
                    JOptionPane.ERROR_MESSAGE);
            return;
        }

        // 读取CSV文件并更新表格
        readCsvFile(csvFile);
    }

    /**
     * 读取CSV文件内容并加载习题数据
     * @param file 同目录下的CSV文件
     */
    private void readCsvFile(File file) {
        // 清空习题列表
        exercises.clear();
        currentExerciseIndex = -1;

        try (BufferedReader br = new BufferedReader(new FileReader(file))) {
            String line;
            int lineNum = 0;
            int validCount = 0; // 有效习题数量

            // 读取CSV文件的每一行
            while ((line = br.readLine()) != null) {
                lineNum++;
                // 跳过表头（第一行）
                if (lineNum == 1) {
                    statusLabel.setText("已加载：" + file.getName() + "（同目录文件）");
                    statusLabel.setForeground(Color.BLUE);
                    continue;
                }

                // 分割CSV数据（以逗号分隔，兼容标准CSV格式）
                String[] data = line.split(",");
                // 验证数据格式（必须包含3列：序号、算式、结果）
                if (data.length == 3) {
                    // 存储习题数据
                    String[] exercise = new String[3];
                    exercise[0] = data[0].trim(); // 序号
                    exercise[1] = data[1].trim(); // 算式
                    exercise[2] = data[2].trim(); // 结果
                    exercises.add(exercise);
                    validCount++;
                } else {
                    // 格式错误提示（仅弹窗一次，避免骚扰）
                    if (lineNum == 2) { // 只在第一次遇到错误时提示
                        JOptionPane.showMessageDialog(this,
                                "文件第" + lineNum + "行格式错误，将跳过无效数据",
                                "格式警告",
                                JOptionPane.WARNING_MESSAGE);
                    }
                }
            }

            // 读取完成提示
            if (validCount == 0) {
                JOptionPane.showMessageDialog(this,
                        "CSV文件中无有效习题数据！",
                        "提示",
                        JOptionPane.INFORMATION_MESSAGE);
                // 禁用按钮
                prevButton.setEnabled(false);
                nextButton.setEnabled(false);
                checkButton.setEnabled(false);
                exerciseLabel.setText("无习题数据");
            } else {
                JOptionPane.showMessageDialog(this,
                        "成功加载 " + validCount + " 道习题",
                        "加载成功",
                        JOptionPane.INFORMATION_MESSAGE);
                // 启用按钮并显示第一题
                showFirstExercise();
            }

        } catch (IOException ex) {
            // 异常处理（文件读取失败）
            statusLabel.setText("读取失败：" + ex.getMessage());
            statusLabel.setForeground(Color.RED);
            JOptionPane.showMessageDialog(this,
                    "文件读取错误：" + ex.getMessage() + "\n请检查文件权限或格式",
                    "读取错误",
                    JOptionPane.ERROR_MESSAGE);
            // 禁用按钮
            prevButton.setEnabled(false);
            nextButton.setEnabled(false);
            checkButton.setEnabled(false);
        }
    }
    
    /**
     * 显示第一题
     */
    private void showFirstExercise() {
        if (!exercises.isEmpty()) {
            currentExerciseIndex = 0;
            showCurrentExercise();
        }
    }
    
    /**
     * 显示上一题
     */
    private void showPreviousExercise() {
        if (currentExerciseIndex > 0) {
            currentExerciseIndex--;
            showCurrentExercise();
        }
    }
    
    /**
     * 显示下一题
     */
    private void showNextExercise() {
        if (currentExerciseIndex < exercises.size() - 1) {
            currentExerciseIndex++;
            showCurrentExercise();
        }
    }
    
    /**
     * 显示当前习题
     */
    private void showCurrentExercise() {
        if (currentExerciseIndex >= 0 && currentExerciseIndex < exercises.size()) {
            String[] exercise = exercises.get(currentExerciseIndex);
            exerciseLabel.setText("第" + exercise[0] + "题：" + exercise[1]);
            answerField.setText(""); // 清空答案输入
            correctAnswerLabel.setText(""); // 清空正确答案
            resultLabel.setText(""); // 清空结果
            
            // 更新按钮状态
            prevButton.setEnabled(currentExerciseIndex > 0);
            nextButton.setEnabled(currentExerciseIndex < exercises.size() - 1);
            checkButton.setEnabled(true); // 启用确定按钮
        }
    }
    
    /**
     * 检查答案
     */
    private void checkAnswer() {
        if (currentExerciseIndex >= 0 && currentExerciseIndex < exercises.size()) {
            String[] exercise = exercises.get(currentExerciseIndex);
            String userAnswer = answerField.getText().trim();
            String correctAnswer = exercise[2];
            
            // 显示正确答案
            correctAnswerLabel.setText("正确答案：" + correctAnswer);
            
            // 检查答案是否正确
            if (userAnswer.equals(correctAnswer)) {
                resultLabel.setText("恭喜，答对了！");
                resultLabel.setForeground(Color.GREEN);
            } else {
                resultLabel.setText("答错了，请再试一次！");
                resultLabel.setForeground(Color.RED);
            }
        }
    }

    /**
     * 主方法：启动程序
     */
    public static void main(String[] args) {
        // Swing GUI 线程安全启动
        SwingUtilities.invokeLater(() -> new CsvExerciseViewer().setVisible(true));
    }
}